#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "module/module_window.h"
#include "module/property/module_port_property.h"

#include "head_button/dialog_new_module.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(this, &MainWindow::send_newModuleData, &this->proFileConfig, &projectFileConfig::recv_newModule);
    connect(&this->proFileConfig, &projectFileConfig::add_module, this, &MainWindow::add_moduleItem);
}

MainWindow::~MainWindow()
{
    delete ui;
}

///---------------------------------------------------------------
/// 公有 槽函数

void MainWindow::recv_newModule(Module_Data data, Module_Data::ModuleType type)
{
    qDebug() << data.get_module_name() << data.get_input() << data.get_output() << data.get_inout();

    // 判断 Module Name 是否存在
    while (this->proFileConfig.checkModule(data.get_module_name()))
    {
        QString right_1 = data.get_module_name().right(1);

        if (right_1.contains(QRegularExpression("^\\d+$"))) // 判断是不是数字
        {
            int num = right_1.toInt();
            num++;
            right_1 = QString::number(num);

            data.set_module_name( data.get_module_name().remove(data.get_module_name().size() - 1, 1) + right_1);
        }
        else
        {
            data.set_module_name( data.get_module_name() + QString::number(1));
        }


        qDebug() << "exists, change name" << data.get_module_name();
    }

    if (type == Module_Data::isModule)
        add_module(data, true);
    else if (type == Module_Data::isChildModule)
        add_childModule(data, QPointF(0, 0), true);
}

void MainWindow::recv_proPathData(Project_Path proPath)
{
    this->setWindowTitle(proPath.proName);
    this->proFileConfig.load_proConfig(proPath);
    this->load_proConfig();
}

void MainWindow::change_tabWidget_tabName(QString tabName)
{
    ui->tabWidget->setTabText(ui->tabWidget->currentIndex(), tabName);
}

void MainWindow::changeContent()
{
    this->ChangeContent = true;
}

void MainWindow::add_moduleItem(Module_Data data, QDomElement e)
{
    QTreeWidgetItem *childItem = new QTreeWidgetItem(this->module_item);
    childItem->setToolTip(0, e.attribute("src")); // 设置鼠标悬停显示内容

    if (e.nodeName() == "module")  // 加载 Module
        childItem->setText(0, data.get_module_name());
    else if (e.nodeName() == "top") // 加载 Master Module
        childItem->setText(0, data.get_module_name() + " (Top)");
}


///---------------------------------------------------------------
/// 私有 槽函数

void MainWindow::on_pushButton_new_module_clicked()
{
    new_module(Module_Data::isModule);
}

void MainWindow::on_actionModule_triggered()
{
    new_module(Module_Data::isModule);
}

void MainWindow::on_pushButton_new_child_module_clicked()
{
    new_module(Module_Data::isChildModule);
}


///---------------------------------------------------------------

void MainWindow::new_module(Module_Data::ModuleType type)
{
    dialog_new_module new_module_dialog(type);

    connect(&new_module_dialog, &dialog_new_module::send_Data, this, &MainWindow::recv_newModule);
    new_module_dialog.show();

    new_module_dialog.exec();
}

void MainWindow::add_module(Module_Data data, bool send_moduleData)
{
    module_window *new_window = new module_window(data, this);
    connect(new_window, &module_window::changeLableName, this, &MainWindow::change_tabWidget_tabName);

    ui->tabWidget->addTab(new_window, data.get_module_name());

    ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); // 将tab移动至最后新增的tab上去

    new_window->show();


    new_window->init();

    if (send_moduleData)
        emit send_newModuleData(data); // 将 data 发送给 projectFileConfig
}

void MainWindow::add_childModule(Module_Data data, QPointF point, bool send_moduleData)
{
    module_window *mwindow = static_cast<module_window *>(ui->tabWidget->currentWidget());

    mwindow->add_child_module(data, point);

    if (send_moduleData)
        ;;
}


void MainWindow::insert_text2textEdit(QString text)
{
    ui->textEdit->setText(text);
}


void MainWindow::load_proConfig()
{
    ///---------------------------------------------------------------
    /// 加载 module

    QIcon folder_icon(QPixmap(":/image/image/Folder.png").scaled(25, 25, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));  // 自适应缩放和平滑缩放

    QDomElement module_table = this->proFileConfig.get_module_tables().at(0).toElement(); // 获取 module_table 节点
    QDomNodeList module_table_list = module_table.childNodes(); // 获取 module_table 节点下的所有子节点

    this->root_item = new QTreeWidgetItem(ui->treeWidget_project);
    this->root_item->setText(0, this->proFileConfig.get_proName());
    this->root_item->setIcon(0, folder_icon);

    this->module_item = new QTreeWidgetItem(root_item);
    this->module_item->setText(0, "Module");
    this->module_item->setIcon(0, folder_icon);

    for (int num(0); num < module_table_list.count(); num++) {
        QDomElement module = module_table_list.at(num).toElement();
        Module_Data data = this->proFileConfig.toModuleDataForID(module.attribute("id"));

        qDebug() << "load : " << data.get_module_name();

        if (! module.isNull())
            this->add_module(data);
        else
            return;

        this->add_moduleItem(data, module);

    }
}


void MainWindow::add_module_property_interface(module_window_property *p)
{
    ui->gridLayout_property->addWidget(p, 0, 0);
}

void MainWindow::add_port_property_interface(module_port_property *p)
{
    ui->gridLayout_property->addWidget(p, 0, 0);
}

void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    ui->tabWidget->removeTab(index);
}

